// 封装axios

import axios from 'axios'

// 导入vuex实例
import store from '@/store/index.js'

// 导入路由实例
import router from '@/router/index'

// 导入饿了么消息提示方法
import { Message } from 'element-ui'

const baseURL = 'http://big-event-vue-api-t.itheima.net'

// 1、创建axios新实例（发请求）
const request = axios.create({
  // 全局配置根路径
  baseURL
})

// 添加请求拦截器=>发送请求之前执行（请求没发呢）
request.interceptors.request.use(function (config) {
  // config 请求配置
  // 场景：判断给需要添加header参数值的接口，添加token
  // 需求：接口请求url以：/my 开头，都需要添加请求头header参数
  // console.log(config)
  /*
    config => 是一个对象
    {
      headers: {Accept: 'application/json, text/plain,'}
      url: "/my/userinfo"
    }

    补充知识点：String实例方法 startsWith 检测是否以某字符开头，是则返回true，不是返回false
    例：let str = 'abcdefg'
     console.log(str.startsWith('abc')) //true
    console.log(str.startsWith('cde')) //false

  */
  if (config.url.startsWith('/my')) {
    // 以/my开头的请求，添加header
    // 怎么在.js文件中获取vuex数据（这里是获取token）=> 导入vuex模块实例（默认导入）
    // store === 等价于 this.$store
    // this.$store.state.模块名.变量名 => 子模块获取state变量
    // console.log('子模块获取state变量', store)
    config.headers.Authorization = store.state.user.token
  }
  // 一定要返回请求配置，拿最新的请求配置，发送请求
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器 =>请求发送成功了，数据响应（返回了数据），但是失败也会走这里
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  return response
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  // 需求❓：在token失效情况下，接口请求401了，跳回登录页重新登录
  // 说明：== 只处理401情况 ==
  // console.log('请求失败了')
  // console.log(error)

  // 解决： 多个接口请求401重复跳转登录页
  if (error.response.status === 401) {
    // 判断如果已经跳转到登录页了，后边的代码就没必要执行了
    // 使用router实例：router.currentRoute.path 获取当前访问页面的地址
    if (router.currentRoute.path === '/login') return

    /**
     * 1. 删除token =》怎么删除vuex存的token？=》导入vuex实例
     * 2. 跳回登录页=> js怎么跳页面？=》导入router实例
     * 3. 添加token失败的消息提示 => 导入message方式
     */
    Message.error('token验证失败，请重新登录')
    store.commit('user/delToken')
    router.replace('/login')
  }
  return Promise.reject(error)
})

// 按需导出
export { baseURL }
// 2、默认导出新axios
export default request
